/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package klijent.kontrolerKI;

import domen.Trening;
import domen.Vezbac;
import java.sql.Date;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import server.util.Transfer;
import klijent.Klijent;
import klijent.gui.util.ModelTabeleVezbaci;

/**
 *
 * @author Ivan Ivic
 */
public class KontrolerKIVezbac {
    private static int signal;

    public static void pripremiFormuRadSaVezbacima(JComboBox jcb, JTable jt, JButton jbSacuvajPromene, JLabel jlVezbacID, JButton jbObrisiVezbaca)
    {
        postaviTreningeUComboBox(jcb);
        ModelTabeleVezbaci mtv = new ModelTabeleVezbaci();
        jt.setModel(mtv);
        jbSacuvajPromene.setEnabled(false);
        jbObrisiVezbaca.setEnabled(false);
        jlVezbacID.setVisible(false);
    }

    public static void postaviTreningeUComboBox(JComboBox jcb)
    {
        Klijent.getInstance().posaljiObjekat(null, Transfer.VRATI_SVE_TRENINGE);
        LinkedList<Trening> listaTreninga = (LinkedList<Trening>) Klijent.getInstance().primiObjekat();
        jcb.removeAllItems();
        Iterator i = listaTreninga.iterator();
        while (i.hasNext())
        {
            jcb.addItem(i.next());
        }
    }

    public static void kreirajVezbaca(JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JComboBox jcbTreninzi)
    {
        try
        {
            Vezbac v = preuzmiPodatkeSaForme(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi);

            Klijent.getInstance().posaljiObjekat(v, Transfer.KREIRAJ_VEZBACA);
            Klijent.getInstance().primiObjekat();
            signal = Klijent.getInstance().getSignal(); // 9011, 9012
            ocistiFormu(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi, null);
        }
        catch (Exception e)
        {
            if (e.getClass() == IllegalArgumentException.class)
            {
                signal = 90111;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim formatirajte datum ispravno!!\n Pravilni format je dd/mm/g !!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else if (e.getClass() == NumberFormatException.class)
            {
                signal = 90112;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim, ispravno unesite numericke vrednosti!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                //signal = 90113;
                //JOptionPane.showMessageDialog(null, e.getMessage(), "Greska", JOptionPane.ERROR_MESSAGE);
            }
        }
        proveriGreske(signal);         
    }

    public static void pronadjiVezbace(JRadioButton jrbClBroj, JRadioButton jrbPrez, JTextField jtxt, JTable jtble)
    {
        if (jrbClBroj.isSelected() || jrbPrez.isSelected())
        {

            Vezbac v = new Vezbac();
            if (jrbClBroj.isSelected()) {
                try {
                    int vezbacId = Integer.parseInt(jtxt.getText().trim());
                    v.setVezbacID(vezbacId);
                    signal = 10015;
                } catch (NumberFormatException e) {
                    signal = 90151;
                    //JOptionPane.showMessageDialog(null, e.getMessage(), "Nepravilan format clanskog broja", JOptionPane.ERROR_MESSAGE);
                }
            } else if (jrbPrez.isSelected()) {
                String prezime = jtxt.getText().trim();
                v.setPrezime(prezime);
                signal = 10015;
            }

            Klijent.getInstance().posaljiObjekat(v, Transfer.PRONADJI_VEZBACE);
            LinkedList<Vezbac> listaVezbaca = (LinkedList<Vezbac>) Klijent.getInstance().primiObjekat();
            //Sesija.getInstance().setVezbaci(listaVezbaca);            
            ModelTabeleVezbaci mtv = new ModelTabeleVezbaci(listaVezbaca);
            jtble.setModel(mtv);
            // prikazi poruku da nema pronadjenih vezbaca
            if (listaVezbaca.isEmpty())
                signal = 10016;                      
        }
        else
        {
            signal = 90152;
            //JOptionPane.showMessageDialog(null, "Greska! \nNiste selekotovali nijednu od pomenutih opcija!\nMolim selektujte da li zelite pretragu po clanskom broju ili po prezimenu! ", "Greska", JOptionPane.ERROR_MESSAGE);
        }
        proveriGreske(signal);
    }

    // trebalo bi implementirati i da se vidi trening za selektovanog vezbaca
    public static void vratiSelektovanogVezbaca(JTable jtblVezbaci, JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JButton jbSacuvajPromene, JButton jbObrisiVezbaca, JLabel jlVezbacID, JComboBox jcbTreninzi)
    {
        int vezbacID;
        Integer s = (Integer) jtblVezbaci.getValueAt(jtblVezbaci.getSelectedRow(), 0);
        vezbacID = s;
        Vezbac selektovaniVezbac = new Vezbac();
        selektovaniVezbac.setVezbacID(vezbacID);
        Klijent.getInstance().posaljiObjekat(selektovaniVezbac, Transfer.VRATI_VEZBACA);
        selektovaniVezbac = (Vezbac) Klijent.getInstance().primiObjekat();


        try
        {
            jtxtIme.setText(selektovaniVezbac.getIme());
            jtxtPrezime.setText(selektovaniVezbac.getPrezime());
            jtxtVisina.setText(String.valueOf(selektovaniVezbac.getVisina()));
            jtxtTezina.setText(String.valueOf(selektovaniVezbac.getTezina()));
            jtxtBodyfat.setText(String.valueOf(selektovaniVezbac.getBodyfat()));
            Date datumRodjenja = selektovaniVezbac.getDatumRodjenja();
            String d = datumRodjenja.toString();
            String dd[] = d.split("-");
            String godina = dd[0];
            String mesec = dd[1];
            String dan = dd[2];
            jtxtDan.setText(dan);
            jtxtMesec.setText(mesec);
            jtxtGodina.setText(godina);
            jbSacuvajPromene.setEnabled(true);
            jbObrisiVezbaca.setEnabled(true);
            
            jlVezbacID.setVisible(true);
            jlVezbacID.setText(String.valueOf(selektovaniVezbac.getVezbacID()));
            for (int i = 0; i < jcbTreninzi.getItemCount(); i++) {
                Trening t = (Trening) jcbTreninzi.getItemAt(i);
                if (t.getSifraTreninga().equals(selektovaniVezbac.getTrening().getSifraTreninga())) {
                    jcbTreninzi.setSelectedItem(t);
                }
            }
        }
        // ako sistem ne moze da prikaze podatk,e prikazuje poruku o tome
        catch (Exception e)
        {
            signal = 10017;
        }
        
    }

    public static void sacuvajVezbaca(JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JComboBox jcbTreninzi, JLabel jlVezbacID, JTable jtVezbaci)
    {
        try
        {
            Vezbac v = preuzmiPodatkeSaForme(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi);
            v.setVezbacID(Integer.parseInt(jlVezbacID.getText().trim()));
            Klijent.getInstance().posaljiObjekat(v, Transfer.SACUVAJ_VEZBACA);
            Klijent.getInstance().primiObjekat();
            signal = Klijent.getInstance().getSignal(); // 9011, 9012
            //ocistiFormu(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi, jlVezbacID);

            Klijent.getInstance().posaljiObjekat(v, Transfer.PRONADJI_VEZBACE);
            LinkedList<Vezbac> listaVezbaca = (LinkedList<Vezbac>) Klijent.getInstance().primiObjekat();
            //Sesija.getInstance().setVezbaci(listaVezbaca);
            ModelTabeleVezbaci mtv = new ModelTabeleVezbaci(listaVezbaca);
            jtVezbaci.setModel(mtv);
        }
        catch (Exception e)
        {
            if (e.getClass() == IllegalArgumentException.class)
            {
                signal = 90111;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim formatirajte datum ispravno!!\n Pravilni format je dd/mm/g !!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else if (e.getClass() == NumberFormatException.class)
            {
                signal = 90112;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim, ispravno unesite numericke vrednosti!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                signal = 90113;
                //JOptionPane.showMessageDialog(null, e.getMessage(), "Greska", JOptionPane.ERROR_MESSAGE);
            }
        }
        proveriGreske(signal);
    }

    public static void obrisiVezbaca(JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JComboBox jcbTreninzi, JLabel jlVezbacID, JTable jtVezbaci, JButton jbSacuvajVezbaca, JButton jbObrisiVezbaca)
    {
        try
        {
            Vezbac v = preuzmiPodatkeSaForme(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi);
            v.setVezbacID(Integer.parseInt(jlVezbacID.getText().trim()));
            Klijent.getInstance().posaljiObjekat(v, Transfer.OBRISI_VEZBACA);
            Klijent.getInstance().primiObjekat();
            signal = Klijent.getInstance().getSignal(); // 9011, 9012
            ocistiFormu(jtxtIme, jtxtPrezime, jtxtVisina, jtxtTezina, jtxtDan, jtxtMesec, jtxtGodina, jtxtBodyfat, jcbTreninzi, jlVezbacID);           
        
             Klijent.getInstance().posaljiObjekat(v, Transfer.PRONADJI_VEZBACE);
            LinkedList<Vezbac> listaVezbaca = (LinkedList<Vezbac>) Klijent.getInstance().primiObjekat();
            //Sesija.getInstance().setVezbaci(listaVezbaca);
            ModelTabeleVezbaci mtv = new ModelTabeleVezbaci(listaVezbaca);
            jtVezbaci.setModel(mtv);

            jbSacuvajVezbaca.setEnabled(false);
            jbObrisiVezbaca.setEnabled(false);
        }
        catch (Exception e)
        {
            if (e.getClass() == IllegalArgumentException.class)
            {
                signal = 90111;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim formatirajte datum ispravno!!\n Pravilni format je dd/mm/g !!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else if (e.getClass() == NumberFormatException.class)
            {
                signal = 90112;
                //JOptionPane.showMessageDialog(null, "Greska!! Molim, ispravno unesite numericke vrednosti!", "Greska", JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                signal = 90113;
                //JOptionPane.showMessageDialog(null, e.getMessage(), "Greska", JOptionPane.ERROR_MESSAGE);
            }
        }
        proveriGreske(signal);       
    }

    private static void proveriGreske(int signal)
    {
        switch(signal)
        {
            case 9011:
                prikaziPoruku(signal, "Slog uspesno sacuvan!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                break;
            case 9012:
                prikaziPoruku(signal, "Slog nije uspesno sacuvan u bazi! Serverska greska!", "Obavestenje - Serverska greska", JOptionPane.ERROR_MESSAGE);
            case 90111:
                prikaziPoruku(signal, "Greska!! Molim formatirajte datum ispravno!!\n Pravilni format je dd/mm/g !!", "Greska", JOptionPane.ERROR_MESSAGE);
                break;
            case 90112:
                prikaziPoruku(signal, "Greska!! Molim, ispravno unesite numericke vrednosti!", "Greska", JOptionPane.ERROR_MESSAGE);
                break;
            case 90113:
                prikaziPoruku(signal, "Dogodila se neocekivana greska!", "Greska - klijentska strana", JOptionPane.ERROR_MESSAGE);
                break;
            case 9013:
                prikaziPoruku(signal, "Izmena uspesno sacuvana!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                break;
            case 9014:
                prikaziPoruku(signal, "Serverski problem!\nIzmena nije mogla biti sacuvana!", "Serverska greska", JOptionPane.ERROR_MESSAGE);
                break;
            case 9015:
                prikaziPoruku(signal, "Vezbac uspesno obrisan!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                break;
            case 9016:
                prikaziPoruku(signal, "Greska!\nVezbac nije mogao biti obrisan", "Serverska greska", JOptionPane.ERROR_MESSAGE);
            case 90151:
                prikaziPoruku(signal, "Nepravilan format clanskog broja", "Klijentska Greska", JOptionPane.ERROR_MESSAGE);
                break;
            case 90152:
                prikaziPoruku(signal, "Greska! \nNiste selekotovali nijednu od pomenutih opcija!\nMolim selektujte da li zelite pretragu po clanskom broju ili po prezimenu! ", "Klijentska Greska", JOptionPane.ERROR_MESSAGE);
            case 9023:
                break;
            case 9024:
                prikaziPoruku(signal, "Server nije u mogucnosti da vrati treninge iz baze! Molim pokusajte ponovo", "Greska", JOptionPane.ERROR_MESSAGE);
                break;
            case 10015:
                break;
            case 10016:
                prikaziPoruku(signal, "Nije pronadjen nijedan vezbac po zadatom kriterijumu!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                break;
            case 10017:
                prikaziPoruku(signal, "Sistem ne moze da prikaze podatke o vezbacu", "Greska", JOptionPane.ERROR_MESSAGE);
                break;
        }
    }

    private static void prikaziPoruku(int signal, String poruka, String naslovPoruke, int vrstaPoruke)
    {
        JOptionPane.showMessageDialog(null, "Signal:" + signal + "\n" + poruka, naslovPoruke, vrstaPoruke);
    }

    private static Vezbac preuzmiPodatkeSaForme(JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JComboBox jcbTreninzi) throws NumberFormatException, IllegalArgumentException
    {
            String ime = jtxtIme.getText().trim();
            String prezime = jtxtPrezime.getText().trim();
            int visina = Integer.parseInt(jtxtVisina.getText().trim());
            int tezina = Integer.parseInt(jtxtTezina.getText().trim());
            double bodyfat = Double.parseDouble(jtxtBodyfat.getText().trim());
            String dan = jtxtDan.getText().trim();
            String mesec = jtxtMesec.getText().trim();
            String godina = jtxtGodina.getText().trim();
            Date datumRodjenja = Date.valueOf(godina + "-" + mesec + "-" + dan);
            Trening t = (Trening) jcbTreninzi.getSelectedItem();
            Vezbac v = new Vezbac(visina, tezina, ime, prezime, datumRodjenja, bodyfat);
            v.setTrening(t);
            return v;
    }

    private static void ocistiFormu(JTextField jtxtIme, JTextField jtxtPrezime, JTextField jtxtVisina, JTextField jtxtTezina, JTextField jtxtDan, JTextField jtxtMesec, JTextField jtxtGodina, JTextField jtxtBodyfat, JComboBox jcbTreninzi, JLabel jlVezbacID)
    {
        jtxtIme.setText("");
        jtxtPrezime.setText("");
        jtxtVisina.setText("");
        jtxtTezina.setText("");
        jtxtDan.setText("");
        jtxtMesec.setText("");
        jtxtGodina.setText("");
        jtxtBodyfat.setText("");
        jlVezbacID.setText("");
        jcbTreninzi.setSelectedIndex(1);
    }
}
